int i;
static const struct {
const char *name;
- const char *vs;
const char *fs;
} program_definitions[] = {
- { "blit", "blit.vs.glsl", "blit.fs.glsl" },
- { "color", "blit.vs.glsl", "color.fs.glsl" },
- { "coloring", "blit.vs.glsl", "coloring.fs.glsl" },
- { "color matrix", "blit.vs.glsl", "color_matrix.fs.glsl" },
- { "linear gradient", "blit.vs.glsl", "linear_gradient.fs.glsl" },
- { "blur", "blit.vs.glsl", "blur.fs.glsl" },
- { "inset shadow", "blit.vs.glsl", "inset_shadow.fs.glsl" },
- { "outset shadow", "blit.vs.glsl", "outset_shadow.fs.glsl" },
- { "unblurred outset shadow", "blit.vs.glsl", "unblurred_outset_shadow.fs.glsl" },
- { "border", "blit.vs.glsl", "border.fs.glsl" },
- { "cross fade", "blit.vs.glsl", "cross_fade.fs.glsl" },
+ { "blit", "blit.fs.glsl" },
+ { "color", "color.fs.glsl" },
+ { "coloring", "coloring.fs.glsl" },
+ { "color matrix", "color_matrix.fs.glsl" },
+ { "linear gradient", "linear_gradient.fs.glsl" },
+ { "blur", "blur.fs.glsl" },
+ { "inset shadow", "inset_shadow.fs.glsl" },
+ { "outset shadow", "outset_shadow.fs.glsl" },
+ { "unblurred outset shadow", "unblurred_outset_shadow.fs.glsl" },
+ { "border", "border.fs.glsl" },
+ { "cross fade", "cross_fade.fs.glsl" },
};
builder = gsk_shader_builder_new ();
gsk_shader_builder_add_define (builder, "GSK_DEBUG", "1");
#endif
+ gsk_shader_builder_set_common_vertex_shader (builder, "blit.vs.glsl",
+ &shader_error);
+
+ g_assert_no_error (shader_error);
+
for (i = 0; i < GL_N_PROGRAMS; i ++)
{
Program *prog = &self->programs[i];
prog->index = i;
prog->id = gsk_shader_builder_create_program (builder,
- program_definitions[i].vs,
program_definitions[i].fs,
&shader_error);
g_propagate_prefixed_error (error, shader_error,
"Unable to create '%s' program (from %s and %s):\n",
program_definitions[i].name,
- program_definitions[i].vs,
+ "blit.vs.glsl",
program_definitions[i].fs);
g_object_unref (builder);
char *vertex_preamble;
char *fragment_preamble;
+
+ int common_vertex_shader_id;
+
int version;
GPtrArray *defines;
g_clear_pointer (&self->defines, g_ptr_array_unref);
+ if (self->common_vertex_shader_id > 0)
+ glDeleteShader (self->common_vertex_shader_id);
+
G_OBJECT_CLASS (gsk_shader_builder_parent_class)->finalize (gobject);
}
return shader_id;
}
+void
+gsk_shader_builder_set_common_vertex_shader (GskShaderBuilder *self,
+ const char *vertex_shader,
+ GError **error)
+{
+ int shader_id;
+
+
+ shader_id = gsk_shader_builder_compile_shader (self,
+ GL_VERTEX_SHADER,
+ self->vertex_preamble,
+ vertex_shader,
+ error);
+
+ g_assert (shader_id > 0);
+ self->common_vertex_shader_id = shader_id;
+}
+
int
gsk_shader_builder_create_program (GskShaderBuilder *builder,
- const char *vertex_shader,
const char *fragment_shader,
GError **error)
{
- int vertex_id, fragment_id;
+ int vertex_id;
+ int fragment_id;
int program_id;
int status;
g_return_val_if_fail (GSK_IS_SHADER_BUILDER (builder), -1);
- g_return_val_if_fail (vertex_shader != NULL, -1);
g_return_val_if_fail (fragment_shader != NULL, -1);
+ g_return_val_if_fail (builder->common_vertex_shader_id != 0, -1);
- vertex_id = gsk_shader_builder_compile_shader (builder, GL_VERTEX_SHADER,
- builder->vertex_preamble,
- vertex_shader,
- error);
- if (vertex_id < 0)
- return -1;
-
+ vertex_id = builder->common_vertex_shader_id;
fragment_id = gsk_shader_builder_compile_shader (builder, GL_FRAGMENT_SHADER,
builder->fragment_preamble,
fragment_shader,
out:
if (vertex_id > 0)
{
+ /* We delete the common vertex shader when destroying the shader builder */
glDetachShader (program_id, vertex_id);
- glDeleteShader (vertex_id);
}
if (fragment_id > 0)